#include <iostream>

int main()
{
    // C++里的const是一个真正的常量
    const int a = 10;   // C里面对const的理解是不可修改值的变量
    // a = 20;  // 这样改肯定不行
    // int *p = &a; // "const int *"类型的值不能用于初始化"int *"类型的实体，就是不能将一个普通指针指向它的地址，得加const
    // const int *p = &a;  // 能指向一个常量的指针，得是常量指针
    int *p = (int *)&a; // 既然C++兼容C，那一定支持强制类型转换
    *p = 20;
    printf("a : %d *p : %d\n", a, *p);
    printf("a : %p *p : %p\n", &a, p);
    // 变量a，它在内存里，用一个指针指向它，然后通过指针把这个内存的值改了，改掉以后a的值还是没变，对它们取地址还是同一块内存？  
    // 出现这种情况的主要原因是：C++对C兼容的同时又要保证a是个常量，所以它做了两件事情：
    // 1、C++里的const的变量不是存在内存里的，因为要是个常量就不能有内存，有内存就一定可以被指针修改，所以它会把值放在符号表里，符号表可以理解为C++给自己留的一块常量区，就相当于在符号表里定义了一排a=10，所以找a就一定会找到10
    // 2、但是又要兼容C，C认为a是个变量，它得有内存，所以它依然可以取地址，于是在取地址时给它分配一块全新的内存，那块内存的名字也叫a
    // 综上所述，a有内存，在内存当中，*p也可以指向这块内存，都没有问题，但是只要通过a去找，它一定会到符号表里去找它的值，它不会把内存的值给你，就保证了a是一个常量的属性
    return 0;
}